<?php
/**
 * Mysqli
 *
 * @package php.db
 */

/**
 * mysqli 연결 클래스 
 *
 * @package php.db
 */
class MysqlImprove extends Mysql {

	/**
	 * 생성자
	 *
	 */
	public function __construct($option = '', $type = 'product') {
		parent::__construct($option, $type);
	}

	/**
	 * database 연결 생성
	 * 
	 * @return resource 연결 resource
	 */
	protected function _connect() { 
		return mysqli_connect($this->host, $this->id, $this->pass, $this->db, $this->port, $this->socket);
	}

	/** 
	 * DB 선택하기 
	 *
	 * @param string $db_name 접속할 데이타베이스명 
	 * @return bool
	 */
	public function selectDB($db_name) { 
		return mysqli_select_db($this->getConnection(), $db_name);
	}

	/**
	 * 실행된 row 수 
	 *
	 * @return int 
	 */
	public function affectedRows() { 
		return mysqli_affected_rows($this->getConnection());
	}


	/**
	 * 연결 닫기 
	 */
	public function close()
	{
		mysqli_close($this->getConnection());
	}

	/**
	 * 에러 메세지 리턴
	 * 
	 * @return string 에러 메세지 
	 */	
	public function error() {
		return mysqli_error($this->getConnection());
	}

	/**
	 * 문자열 escape	
	 * 
	 * @param string $str  escape 될 문자열 
	 * @return string escape 된 문자열
	 */
	public function escape($str) { 
		return mysqli_real_escape_string($this->getConnection(), $str);
	}

	/**
	 * 실행된 select 쿼리에 대해서 fetch 를 통해 한 행(row)을 리턴한다. 
	 *
	 * 리턴되는 값은 array('필드' => 'ㅁㅁㅁ', ...); 형태를 가진다. 
	 * 
	 * @param resource $result select 결과로 나온 resource
	 * @return array row 데이타 
	 */
	public function fetch($result) {
		return mysqli_fetch_assoc($result);
	}


	public function fetchField($result, $attribute = 'name') { 
		$arr = mysqli_fetch_fields($result); 

		$temp = array();

		foreach ($arr as $value) { 
			$temp[] = $value->{$attribute};
		}
	
		return $temp;
	}

	/** 
	 * 메모리 해제 
	 * 
	 * @return bool
	 */
	public function free($result) {
		return mysqli_free_result($result);
	}

	/**
	 * 쿼리의 결과로 나온 필드의 개수를 리턴한다.
	 *
	 * @param resource $result select 결과로 나온 resource
	 * @return int 필드개수 
	 */
	public function getFieldCount($result) {
		return mysqli_field_count($result);
	}

	/**
	 * 정해진 위치의 필드 이름을 얻어온다. 
	 *
	 * @param resource $result select 결과로 나온 resource
	 * @param int $i 필드 위치, 처음은 0 
	 * @return string 필드이름 
	 */
	public function getFieldName($result, $i) {
		return mysqli_fetch_field_direct($result, $i)->name;
	}


	public function getFieldList($result) { 
		$arr = $this->fetchField($result, 'name');

		return $arr;
	}

	/**
	 * 정해진 위치의 필드 타입을 얻어온다. 
	 *
	 * @param resource $result select 결과로 나온 resource
	 * @param int $i 필드 위치, 처음은 0 
	 * @return string 필드타입
	 */
	public function getFieldType($result, $i) { 
		return mysqli_fetch_field_direct($result, $i)->type;
	}

	public function getFieldTypeList($result) {
		return $this->fetchField($result, 'type');
	}

	function getInsertId() { 
		return mysqli_insert_id($this->getConnection());
	}

	/** 
	 * 일반 쿼리 실행 
	 * 
	 * @param string $sql 실행될 query 
	 * @return resource 실행 resource
	 */
	public function query($sql) {
		$this->addSql($sql);

		$this->setResult(mysqli_query($this->getConnection(), $sql));
		return $this->getResult();
	}


	/**
	 * 커서 이동 
	 * 
	 * @param int $count 이동시킬 상대위치, 사직행은 0 
	 * @return bool
	 */
	public function seek($count) { 
		return mysqli_data_seek ($this->getResult(), $count);
	}

	public function prepare($sql) { 
		$this->addSql($sql);

		$this->setStatement(mysqli_prepare($this->getConnection(), $sql));
		return $this->getStatement();
	}

	public function bind() { 
		$arr = func_get_args();

		$arr = array_merge(array($this->getStatement()), $arr);

		return call_user_func_array("mysqli_stmt_bind_param", $arr);
	}

	public function execute() { 
		return mysqli_stmt_execute($this->getStatement());
	}

	/**
	 * 프로시저 메모리 해제 
	 * 
	 * @param resource $stmt prepare결과 나온 resource
	 * @return bool  
	 * @see Mysql_i::prepare()
	 */
	public function freeStatement($stmt) { 
		return mysqli_stmt_close($stmt);
	}

}

?>